package com.lefevre.cms.common;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

/**
 * 接口返回类
 *
 * @author Lefevre
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(description = "接口响应对象")
public class ApiResult<T> implements Serializable {

    private static final long serialVersionUID = 4288836348495315922L;

    @ApiModelProperty("业务状态码")
    private Integer code;
    @ApiModelProperty("业务说明")
    private String message;
    @ApiModelProperty("业务数据")
    private T data;

    /**
     * 成功
     *
     * @param <T> 数据类型
     * @return {@link ApiResult}
     */
    public static <T> ApiResult<T> success() {
        return new ApiResult<T>(ApiResultEnum.SUCCESS.getCode(), ApiResultEnum.SUCCESS.getMessage(), null);
    }

    /**
     * 成功
     *
     * @param apiResultEnum 消息枚举
     * @param <T>           数据类型
     * @return {@link ApiResult}
     */
    public static <T> ApiResult<T> success(ApiResultEnum apiResultEnum, T data) {
        return new ApiResult<T>(apiResultEnum.getCode(), apiResultEnum.getMessage(), data);
    }

    /**
     * 成功
     *
     * @param data 接口数据
     * @param <T>  数据类型
     * @return {@link ApiResult}
     */
    public static <T> ApiResult<T> success(T data) {
        return new ApiResult<T>(ApiResultEnum.SUCCESS.getCode(), ApiResultEnum.SUCCESS.getMessage(), data);
    }

    /**
     * 失败
     *
     * @param <T> 数据类型
     * @return {@link ApiResult}
     */
    public static <T> ApiResult<T> failure() {
        return new ApiResult<T>(ApiResultEnum.FAILURE.getCode(), null, null);
    }

    /**
     * 失败
     *
     * @param message 状态说明
     * @param <T>     数据类型
     * @return {@link ApiResult}
     */
    public static <T> ApiResult<T> failure(String message) {
        return new ApiResult<T>(ApiResultEnum.FAILURE.getCode(), message, null);
    }

    /**
     * 失败
     *
     * @param <T> 数据类型
     * @return {@link ApiResult}
     */
    public static <T> ApiResult<T> failure(T data) {
        return new ApiResult<T>(ApiResultEnum.FAILURE.getCode(), "请求错误", data);
    }

    /**
     * 失败
     *
     * @param code    状态码
     * @param message 状态说明
     * @param <T>     数据类型
     * @return {@link ApiResult}
     */
    public static <T> ApiResult<T> failure(Integer code, String message) {
        return new ApiResult<T>(code, message, null);
    }
}
